# ТЗ на Gamebox Практикум для направления Unity
## Автор: Войнаренко Сергей Михайлович
### Билд: [ссылка](https://disk.yandex.ru/d/u7hIW1a2eSiG8g)
##
## Управление:

&emsp;***W, A, S, D / Стрелки управления курсором*** — перемещение героя

&emsp;***Клик левой кнопкой мыши*** — атака

&emsp;***Клик правой кнопкой мыши*** — перезарядка

&emsp;***Вращение колеса мыши*** — увеличение / уменьшение масштаба

&emsp;***Escape*** — пауза

## Структура проекта:

&emsp;***/Imported*** — дополнительные сторонние библиотеки

&emsp;***/Materials*** — материалы

&emsp;***/Plugins*** — внешние плагины

&emsp;***/Prefabs/***

&emsp;&emsp;***Hero*** — префабы игрока и боеприпаса

&emsp;&emsp;***Hud*** — префабы HUD и дочерних элементов

&emsp;&emsp;***Infrastructure*** — префабы, необходимые для запуска игры

&emsp;&emsp;***Level*** — префабы элементов игрового уровня

&emsp;&emsp;***UI*** — префабы окон

&emsp;***/Resources/StaticData*** — классы `ScriptableObject` с настройками

&emsp;***/Scenes/***

&emsp;&emsp;**Initial** — сцена инициализации

&emsp;&emsp;**Menu** — сцена главного меню

&emsp;&emsp;**Main** — сцена игрового уровня

&emsp;&emsp;**EndGame** — сцена завершения игры

&emsp;***/Scripts/***

&emsp;&emsp;***Infrastructure/***

&emsp;&emsp;&emsp;`GameBootstrapper.cs` — точка входа в игру

&emsp;&emsp;&emsp;`SceneLoader.cs` — загрузчик сцен

&emsp;&emsp;&emsp;***States/***`GameStateMachine.cs` — машина состояний игры

&emsp;&emsp;***Data*** — классы, содержащие динамические данные и статические методы

&emsp;&emsp;***Services/***

&emsp;&emsp;&emsp;***Input/***`InputService.cs` — сервис пользовательского ввода

&emsp;&emsp;&emsp;***Loot/***`LootService.cs` — сервис выпадающих предметов

&emsp;&emsp;&emsp;***Progress/***`ProgressService.cs` — сервис прогресса игрока

&emsp;&emsp;&emsp;***StaticData/***`StaticDataService.cs` — сервис статичных данных

&emsp;&emsp;&emsp;***Window/***`WindowService.cs` — сервис окон пользовательского интерфейса

&emsp;&emsp;&emsp;`AllServices.cs` — контейнер сервисов для внедрения зависимостей

&emsp;&emsp;***Logic*** — вспомогательные и общие классы

&emsp;&emsp;***Factory/***

&emsp;&emsp;&emsp;`GameFactory.cs` — основная фабрика

&emsp;&emsp;&emsp;`LootFactory.cs` — фабрика выпадающих предметов

&emsp;&emsp;&emsp;`UiFactory.cs` — фабрика пользовательского интерфейса

&emsp;&emsp;***UI*** — классы пользовательского интерфейса

&emsp;&emsp;***Level*** — классы игрового уровня

&emsp;&emsp;***Hero*** — классы героя

&emsp;&emsp;***Bullet*** — классы боеприпаса

&emsp;***/Settings/InputSystem*** — настройки `InputSystem`

## Иерархия объектов в сценах:

**GameRunner** — вспомогательный объект, создающий **GameBootstrapper**

**Main Camera** — основная камера

**Virtual Camera** — виртуальная камера Cinemachine

**Directional Light** — источник света

**EventSystem** — объект, содержащий обработчики входа, рэйкастинга и отправки событий

**Plane** — плоскость для конвертации координат курсора

**NavMeshSurface** — навигационная сетка

**NavMeshGenerator** — вспомогательный объект для рантайм инициализации **NavMeshSurface**

**InputSupport** — вспомогательный объект для отслеживания пользовательского ввода

## Архитектура:

`GameBootstrapper.cs` — точка входа. При запуске инстанциирует из префаба загрузочную штору `_curtainPrefab`, создаёт новый экземпляр класса `Game`, переводит машину состояний в `BootstrapState` и переносит себя в `DonDestroyOnLoad`.

В `BootstrapState` происходит регистрация всех сервисов, после чего происходит переход в `LoadProgressState`.

В `LoadProgressState` инициируется новый прогресс игрока ~~или загружается сохранённый~~, происходит переключение в `LoadMenuState` и загружается сцена **Menu**.

Внедрение зависимостей происходит в `GameStateMachine` для каждого из состояний, а для создаваемых объектов — в соответствующих фабриках.